package com.hspedu.exception_.throws_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * @Author Stringzhua
 * @Date 2024/3/8 12:05
 * description:修饰符是不能缩小只能扩大，异常是不能扩大只能缩小。
 */
public class ThrowsDetail {
    public static void main(String[] args) {
        f2();
    }

    public static void f2() /*throws ArithmeticException*/ {
        //1.对于编译异常,程序必须处理，使用try-catch 或者 throws
        //2.对于运行时异常，程序中如果没有进行处理，默认就是throws的方式处理
        int n1 = 10;
        int n2 = 0;
        double res = n1 / n2;//Exception in thread "main" java.lang.ArithmeticException: / by zero
    }
}

class Son extends Father {//子类
    //3.子类重写父类的方法时,对抛出的异常的规定:
    //子类重写的方法，所抛出的异常类型要么和父类抛出的异常一致，
    //要么为父类抛出的异常类型的子类型

    //子类的异常是不能扩大父类的异常【父类：RuntimeException 子类：Exception      子类会报错】
    // 子类能抛出的异常要么一致，要么是父类异常的子类型【父类:RuntimeException 子类可以为:RuntimeException /NullPointerException... 】
    //修饰符是不能缩小只能扩大，异常是不能扩大只能缩小。

    //4.在throws异常处理过程中，如果在方法中有try-catch,就相当于异常处理，就可以不必throws
    @Override
    public void method() throws NullPointerException {
        super.method();
    }

    //    public static void f1() throws FileNotFoundException {
//        //f3()报错
//        //1.f3()方法抛出的是编译异常,FileNotFoundException
//        //2.即这时,就要求f1()必须处理编译异常
    //3.在f1()中,要么try-catch 要么throws这个异常
//        f3();//抛出异常
//    }
    public static void f1() {
        //f3()报错
        //1.f3()方法抛出的是编译异常,FileNotFoundException
        //2.即这时,就要求f1()必须处理编译异常
        try {
            f3();//抛出异常
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void f3() throws FileNotFoundException {
        FileInputStream fileInputStream = new FileInputStream("d://aa.txt");
    }
    public static void f4(){
        //1.这里在f4()中调用方法f5()--->ok
        //2.原因是f5()抛出的是运行异常
        //3.java中，并不要求程序员必须去显式的处理运行异常，因为有默认处理机制
        f5();
    }
    public static void f5() throws ArithmeticException{}
}


class Father {//父类

    public void method() throws RuntimeException {

    }
}